import { getCartList, changeCount, delSelect } from '@/api/cart'
import { Toast } from 'vant'
// 购物车
export default {
  namespaced: true,
  state () {
    return {
      cartList: []
    }
  },
  getters: {
    // 购物车商品总数量
    cartTotal (state) {
      return state.cartList.reduce((sum, item) => sum + item.goods_num, 0)
    },
    // 选中的商品
    selCattList (state) {
      return state.cartList.filter(item => item.isChecked)
    },
    // 选中商品的总数
    selCount (state, getters) {
      return getters.selCattList.reduce((sum, item) => sum + item.goods_num, 0)
    },
    // 选中商品的总价格
    selPrice (state, getters) {
      return getters.selCattList.reduce((sum, item) => {
        return sum + item.goods_num * item.goods.goods_price_min
      }, 0).toFixed(2)
    },
    // 是否全选
    isAllChecked (state) {
      return state.cartList.every(item => item.isChecked)
    }
  },
  mutations: {
    // 提供一个设置cartList mutation -- 获取购物车列表
    setCartList (state, newList) {
      state.cartList = newList
    },
    // 找到对应的 id 的项，isCheck状态取反
    toggleCheck (state, goodsId) {
      const goods = state.cartList.find(item => item.goods_id === goodsId)
      goods.isChecked = !goods.isChecked
    },
    // 全部反选
    toggleAllChecked (state, falg) {
      // 同步所有的商品勾选框的状态
      state.cartList.forEach(item => {
        item.isChecked = falg
      })
    },
    // 更新对应的商品数量
    changCount (state, { goodsNum, goodsId }) {
      const goods = state.cartList.find(item => item.goods_id === goodsId)
      if (goods) {
        goods.goods_num = goodsNum
      }
    }
  },
  actions: {
    // 获取购物车列表
    async getCartAction (context) {
      const { data } = await getCartList()
      //   console.log(data)
      //   后台返回的数据中，不包含复选框的选中状态，为了实现将来的功能
      // 需要手动维护数据，给没一项添加一个 isChecked 状态，标记当前商品是否选中
      data.list.forEach(item => {
        item.isChecked = true
      })
      context.commit('setCartList', data.list)
    },

    // 修改商品数量
    async changCountAction (context, obj) {
      const { goodsNum, goodsId, goodsSkuId } = obj
      await changeCount(goodsId, goodsNum, goodsSkuId)
      // 更新对应的商品数量
      context.commit('changCount', { goodsNum, goodsId })
    },

    // 删除购物车商品
    async delSelectAction (context) {
      const selCattList = context.getters.selCattList
      const cartIds = selCattList.map(item => item.id)
      await delSelect(cartIds)
      Toast('删除成功')
      // 重新拉取最新的购物车数据(请求接口，重新渲染)
      context.dispatch('getCartAction')
    }
  }
}
